﻿Public Class TMyUserList
    Implements System.IDisposable

    Private _UserList As New List(Of TMyUser)
    Private _Query As New TMyQuery
    Public Sub New(ByVal AConnection As TMySession)
        _Query.Session = AConnection
    End Sub
    Default Public ReadOnly Property Users(ByVal Index As Integer) As TMyUser
        Get
            Return _UserList(Index)
        End Get
    End Property
    Public ReadOnly Property Count() As Integer
        Get
            Return _UserList.Count
        End Get
    End Property
    Public Sub Refresh()
        _UserList.Clear()
        _Query.Clear()
        _Query.SQL.AppendLine("SELECT DISTINCT `User`, `Host` FROM `mysql`.`user`")
        _Query.SQL.AppendLine("UNION")
        _Query.SQL.AppendLine("SELECT DISTINCT `User`, `Host` FROM `mysql`.`db`")
        _Query.SQL.AppendLine("UNION")
        _Query.SQL.AppendLine("SELECT DISTINCT `User`, `Host` FROM `mysql`.`tables_priv`")
        _Query.SQL.AppendLine("UNION")
        _Query.SQL.AppendLine("SELECT DISTINCT `User`, `Host` FROM `mysql`.`columns_priv`")
        _Query.SQL.AppendLine("UNION")
        _Query.SQL.AppendLine("SELECT DISTINCT `User`, `Host` FROM `mysql`.`procs_priv`")
        _Query.SQL.AppendLine("ORDER BY")
        _Query.SQL.AppendLine(" `User` ASC")
        _Query.SQL.AppendLine(",`Host` ASC")
        _Query.Execute()
        While Not _Query.Eof
            Dim item As New TMyUser(_Query.Session)
            item._UserName = _Query.FieldAsString("User")
            item._Host = _Query.FieldAsString("Host")
            _UserList.Add(item)
            _Query.MoveNext()
        End While
        _Query.Close()
    End Sub

    Private disposedValue As Boolean = False        ' 重複する呼び出しを検出するには

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: 他の状態を解放します (マネージ オブジェクト)。
            End If
            _UserList.Clear()
            _Query.Dispose()
            ' TODO: ユーザー独自の状態を解放します (アンマネージ オブジェクト)。
            ' TODO: 大きなフィールドを null に設定します。
        End If
        Me.disposedValue = True
    End Sub

#Region " IDisposable Support "
    ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
    Public Sub Dispose() Implements IDisposable.Dispose
        ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class
